package tata.R;



import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 作为返回客户端请求的包装类
 */
public class Response<T> implements Serializable {
    @Serial
    private static final long serialVersionUID = -850369598559469602L;
    /**
     * 状态:success或fail,必须元素，符合期望调用则success，否则fail
     * {@link Status}
     */
    private String status;
    /**
     * 错误码，status=fail时可能需要，一般不需要
     * {@link Code}
     */
    private String code;
    /**
     * 描述信息，一般失败的时候需要返回调用方失败原因描述，当然返回成功描述也可以
     */
    private String message;
    /**
     * 如果返回的是单个对象，则放这个字段返回
     */
    private T object;
    /**
     *如果返回的是需要分页的列表数据，则数据放这个字段
     */
    private List<T> list;
    /**
     * 如果返回的是需要分页的列表数据，则记录总数放这个字段，用于前端分页
     */
    private long count;
    /**
     * 如果返回的是多个不同类型的对象或者集合数据，则放这个字段，个别特殊业务需求需要
     */
    private Map<String,T> mix;

    /**
     * websocket消息推送时需要
     * 完成状态，0表示未完成，1表示完成
     */
    private int complete;


    /*******************************************************
     * 开发人员操作方法
     *
     ********************************************************/
    public String getStatus() {
        return status;
    }
    public Response<T> setStatus(Status status) {
        this.status = status.getValue();
        return this;
    }
    public String getCode() {
        return code;
    }
    public Response<T> setCode(Code code) {
        this.code = code.getValue();
        return this;
    }
    public String getMessage() {
        return message;
    }
    public Response<T> setMessage(String message) {
        this.message = message;
        return this;
    }

    public Response<T> setObject(T object) {
        this.object = object;
        return this;
    }
    public T getObject() {
        return object;
    }
    public List<T> getList() {
        return list;
    }
    public Map<String, T> getMix() {
        return mix;
    }
    public Response<T> setMix(Map<String, T> mix) {
        this.mix = mix;
        return this;
    }

    public int getComplete() {
        return complete;
    }


    public long getCount() {
        return count;
    }
    public Response<T> setCount(long count) {
        this.count = count;
        return this;
    }
    public Response<T> setList(List<T> list) {
        this.list = list;
        return this;
    }
    public static <T> Response<T> success(Class<T> clazz){
        Response<T> response = new Response<>();
        response.status = Status.SUCCESS.getValue();
        return response;
    }
    public static <T> Response<T> fail(String message,Class<T> clazz){
        Response<T> response = new Response<>();
        response.status = Status.FAIL.getValue();
        response.message = message;
        return response;
    }
    public boolean failed(){
        return Status.FAIL.getValue().equals(this.status);
    }

    /**
     * 转换，解决泛型不匹配的话status和code不好取和赋值问题
     */
    public static <T> Response<T> transfer(Response<?> response,Class<T> clazz){
        Response<T> transferResponse = new Response<>();
        transferResponse.status = response.status;
        transferResponse.code = response.code;
        transferResponse.message = response.message;
        return transferResponse;
    }

    /*******************************************************
     * 开发人员不能操作方法
     *
     ********************************************************/
    void setStatus(String status) {
        this.status = status;
    }

    void setCode(String code) {
        this.code = code;
    }
}
